package rpc

import (
	"encoding/binary"
	"net"
)

// 前 8 个字节都是长度，其中前 4 个字节是 head 的长度，后 4 字节是 body 长度，
// 读取两个数值后加起来，就是总共要读取的报文长度，减掉 8 字节就是剩下要读取的报文长度
func ReadMsg(conn net.Conn) ([]byte, error) {
	// 第一次读：先读取 8 字节数据
	lenBs := make([]byte, numOfLengthBytes)
	_, err := conn.Read(lenBs)
	if err != nil {
		return nil, err
	}
	headLength := binary.BigEndian.Uint32(lenBs[:4])
	bodyLength := binary.BigEndian.Uint32(lenBs[4:])
	length := headLength + bodyLength

	// 第二次读：根据前面获取的内容长度，读取剩余表示内容的数据
	data := make([]byte, length)
	_, err = conn.Read(data[8:])
	if err != nil {
		return nil, err
	}
	copy(data[:8], lenBs)
	return data, nil
}
